/*************************************************************************
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: IBM Corporation
 *
 *  Copyright: 2008 by IBM Corporation
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/*************************************************************************
 * @file 
 *  the class for section frib and process section and page layout
 ************************************************************************/
/*************************************************************************
 * Change History
Jan 2005		Created
 ************************************************************************/
#include "lwpfribsection.hxx"
#include "lwpfribbreaks.hxx"
#include "lwpstory.hxx"
#include "lwpsection.hxx"
#include "xfilter/xfstylemanager.hxx"
#include "xfilter/xfsectionstyle.hxx"
#include "xfilter/xfsection.hxx"
#include "xfilter/xfindex.hxx"
#include "lwpfribptr.hxx"
#include "lwpglobalmgr.hxx"

LwpFribSection::LwpFribSection(LwpPara *pPara)
	 : LwpFrib(pPara),m_pMasterPage(NULL)
{
		
}

LwpFribSection::~LwpFribSection()
{
	if(m_pMasterPage)
	{
		delete m_pMasterPage;
		m_pMasterPage = NULL;
	}
}

/**
 * @descr:	Read section frib information   
 * 
 */
void LwpFribSection::Read(LwpObjectStream *pObjStrm, sal_uInt16 len)
{
	m_Section.ReadIndexed(pObjStrm);
}

/**
 * @descr:	Get section pointer  
 * 
 */
LwpSection* LwpFribSection::GetSection()
{
	return static_cast<LwpSection*>(m_Section.obj());
}

/**
 * @descr:	Register section style 
 * 
 */
void LwpFribSection::RegisterSectionStyle()
{	
	LwpPageLayout* pLayout = GetPageLayout();
	if(pLayout)
	{
		m_pMasterPage = new LwpMasterPage(m_pPara, pLayout);	
		m_pMasterPage->RegisterMasterPage(this);		
	}
}

/**
 * @descr:	Register section style 
 * 
 */
void LwpFribSection::SetSectionName()
{
	LwpSection* pSection = GetSection();
	if(pSection)
	{
		LwpStory* pStory = static_cast<LwpStory*>(m_pPara->GetStoryID()->obj());
		pStory->SetSectionName(pSection->GetSectionName());
	}	
}

/**
 * @descr:	Get page layout that current section points
 * 
 */
LwpPageLayout* LwpFribSection::GetPageLayout()
{				
	if(GetSection())
		return GetSection()->GetPageLayout();	
	return NULL;	
}

/**
 * @descr:	XFConvert section
 * 
 */
void LwpFribSection::ParseSection()
{	
	LwpPageLayout* pLayout = GetPageLayout();
	if(pLayout)
	{
		// StartWithinColume not support now
		LwpLayout::UseWhenType eSectionType = pLayout->GetUseWhenType();
		if(eSectionType==LwpLayout::StartWithinColume)
		{
			return;
		}
		if(m_pMasterPage)
		{
			m_pMasterPage->ParseSection(this);
		}
	}
	else
	{
		LwpStory* pStory = static_cast<LwpStory*> ( m_pPara->GetStoryID()->obj() );
		if (m_Section.obj()->GetTag() == VO_INDEXSECTION)
		{
			sal_Bool bRunin = sal_False;
			sal_Bool bSeparator = sal_False;
			//create a new section and add it to container
			XFIndex* pIndex = new XFIndex;
			pIndex->SetIndexType(enumXFIndexAlphabetical);
			/*
			LwpIndexSection* pIndexSection = static_cast<LwpIndexSection*>(m_Section.obj());
			if (pIndexSection->IsFormatRunin())
				bRunin = sal_True;
			if (pIndexSection->IsFormatSeparator())
				bSeparator = sal_True;
			pIndex->SetDefaultAlphaIndex(A2OUSTR(""),bRunin,bSeparator);
			*/
			SetDefaultAlphaIndex(pIndex);
					
			pStory->AddXFContent( pIndex );	
			m_pPara->SetXFContainer( pIndex );						
		}
		else
		{
			XFContentContainer* pContent = pStory->GetXFContent();	
			m_pPara->SetXFContainer( pContent );	
		}
	}	
}

void LwpFribSection::SetDefaultAlphaIndex(XFIndex * pXFIndex)
{
	LwpFoundry* pFoundry = m_pPara->GetFoundry();
	OUString styleName = pFoundry->FindActuralStyleName(A2OUSTR("Separator"));	
	
	LwpIndexSection* pIndexSection = static_cast<LwpIndexSection*>(m_Section.obj());
	XFIndexTemplate * pTemplateSep = new XFIndexTemplate();
	if (pIndexSection->IsFormatSeparator())
	{
		pXFIndex->SetSeparator(sal_True);
		pTemplateSep->AddEntry(enumXFIndexTemplateText,A2OUSTR(""));
	}
	//pXFIndex->AddTemplate(A2OUSTR("separator"),A2OUSTR("Separator"),pTemplateSep);
	pXFIndex->AddTemplate(A2OUSTR("separator"),styleName,pTemplateSep);

	
	styleName = pFoundry->FindActuralStyleName(A2OUSTR("Primary"));
	
	XFIndexTemplate * pTemplate1 = new XFIndexTemplate();
	pTemplate1->AddEntry(enumXFIndexTemplateText,A2OUSTR(""));
	pTemplate1->AddEntry(enumXFIndexTemplateTab,A2OUSTR(""));
	pTemplate1->AddEntry(enumXFIndexTemplatePage,A2OUSTR(""));					
	//pXFIndex->AddTemplate(Int32ToOUString(1),A2OUSTR("Primary"),pTemplate1);
	pXFIndex->AddTemplate(Int32ToOUString(1),styleName,pTemplate1);
	
	XFIndexTemplate * pTemplate2 = new XFIndexTemplate();
	pTemplate2->AddEntry(enumXFIndexTemplateText,A2OUSTR(""));
	pTemplate2->AddEntry(enumXFIndexTemplateTab,A2OUSTR(""));
	pTemplate2->AddEntry(enumXFIndexTemplatePage,A2OUSTR(""));	
	XFIndexTemplate * pTemplate3 = new XFIndexTemplate();
	pTemplate3->AddEntry(enumXFIndexTemplateText,A2OUSTR(""));
	pTemplate3->AddEntry(enumXFIndexTemplateTab,A2OUSTR(""));
	pTemplate3->AddEntry(enumXFIndexTemplatePage,A2OUSTR(""));
		
	if (pIndexSection->IsFormatRunin())
	{
		//pXFIndex->AddTemplate(Int32ToOUString(2),A2OUSTR("Primary"),pTemplate2);			
		//pXFIndex->AddTemplate(Int32ToOUString(3),A2OUSTR("Primary"),pTemplate3);
		pXFIndex->AddTemplate(Int32ToOUString(2),styleName,pTemplate2);			
		pXFIndex->AddTemplate(Int32ToOUString(3),styleName,pTemplate3);
	}
	else
	{
		//pXFIndex->AddTemplate(Int32ToOUString(2),A2OUSTR("Secondary"),pTemplate2);			
		//pXFIndex->AddTemplate(Int32ToOUString(3),A2OUSTR("Secondary"),pTemplate3);	
		styleName = pFoundry->FindActuralStyleName(A2OUSTR("Secondary"));
		pXFIndex->AddTemplate(Int32ToOUString(2),styleName,pTemplate2);			
		pXFIndex->AddTemplate(Int32ToOUString(3),styleName,pTemplate3);	
	}
}


LwpMasterPage::LwpMasterPage(LwpPara* pPara, LwpPageLayout* pLayout)
	:m_pPara(pPara),m_pLayout(pLayout),m_bNewSection(sal_False)
{
}

/**
 * @descr:	Register master page style for para style and register section style if necessary
 * 
 */
sal_Bool LwpMasterPage::RegisterMasterPage(LwpFrib* pFrib)
{	
	//if there is no other frib after current firb, register master page in starting para of next page
	if(IsNextPageType()&&(!pFrib->HasNextFrib()))
	{
		LwpStory* pStory = static_cast<LwpStory*>(m_pPara->GetStoryID()->obj());
		pStory->SetCurrentLayout(m_pLayout);
		RegisterFillerPageStyle();
		return sal_False;
	}	

	m_bNewSection = sal_False;
	//sal_Bool bSectionColumns = sal_False;

	XFParaStyle* pOverStyle = new XFParaStyle;
	*pOverStyle = *(m_pPara->GetXFParaStyle());
	pOverStyle->SetStyleName(A2OUSTR(""));
	
	LwpLayout::UseWhenType eUserType = m_pLayout->GetUseWhenType();	
	switch(eUserType)
	{
		case LwpLayout::StartWithinColume://not support now
		{
			m_bNewSection = sal_False;
			break;
		}
		case LwpLayout::StartWithinPage:
		{				
			m_bNewSection = sal_True;
			//bSectionColumns = sal_True;
			break;
		}
		case LwpLayout::StartOnNextPage:	//fall throught
		case LwpLayout::StartOnOddPage:	//fall throught
		case LwpLayout::StartOnEvenPage:
		{							
			LwpStory* pStory = static_cast<LwpStory*>(m_pPara->GetStoryID()->obj());
			pStory->SetCurrentLayout(m_pLayout);
			//get odd page layout when the current pagelayout is mirror
			m_pLayout = pStory->GetCurrentLayout();
			m_bNewSection = IsNeedSection();	
			//bSectionColumns = m_bNewSection;
			pOverStyle->SetMasterPage( m_pLayout->GetStyleName());
			RegisterFillerPageStyle();
			break;
		}			
		default:
			break;
	}		
	
	//register tab style;
	LwpStory* pStory = static_cast<LwpStory*>(m_pPara->GetStoryID()->obj());
	pStory->SetTabLayout(m_pLayout);
	m_pPara->RegisterTabStyle(pOverStyle);
	
	XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
	m_StyleName = pXFStyleManager->AddStyle(pOverStyle)->GetStyleName();
	//register section style here		
	if(m_bNewSection)
	{
		XFSectionStyle* pSectStyle= new XFSectionStyle();		
		//set margin
		LwpStory* pStory = static_cast<LwpStory*>(m_pPara->GetStoryID()->obj());
		if(pStory)
		{
			LwpPageLayout* pCurrentLayout = pStory->GetCurrentLayout();
			double fLeft = m_pLayout->GetMarginsValue(MARGIN_LEFT)- pCurrentLayout->GetMarginsValue(MARGIN_LEFT);
			double fRight = m_pLayout->GetMarginsValue(MARGIN_RIGHT)- pCurrentLayout->GetMarginsValue(MARGIN_RIGHT);
			pSectStyle->SetMarginLeft(fLeft);
			pSectStyle->SetMarginRight(fRight);
		}

		//if(bSectionColumns)
		//{
			//set columns
			XFColumns* pColumns = m_pLayout->GetXFColumns();
			if(pColumns)
			{
				pSectStyle->SetColumns(pColumns);
			}
		//}
		m_SectionStyleName = pXFStyleManager->AddStyle(pSectStyle)->GetStyleName();
	}
	return sal_False;			
}

/**
 * @descr:	Whether it need create a new section
 * 
 */
sal_Bool LwpMasterPage::IsNeedSection()
{
	sal_Bool bNewSection = sal_False;
	//get story
	LwpStory* pStory = static_cast<LwpStory*>(m_pPara->GetStoryID()->obj());	
	//if pagelayout is modified, register the pagelayout
	if(pStory->IsPMModified())
	{
		bNewSection = pStory->IsNeedSection();		
	}
	return bNewSection;
}

/**
 * @descr:	Create XFSection if necessary
 * 
 */
XFSection* LwpMasterPage::CreateXFSection()
{	
	if(m_bNewSection)
	{							
		//new a section
		XFSection* pXFSection = new XFSection();		
		pXFSection->SetStyleName(m_SectionStyleName);
		return pXFSection;
	}
	return NULL;
}

/**
 * @descr:	Parse section
 * 
 */
void LwpMasterPage::ParseSection(LwpFrib* pFrib)
{
	LwpFribPtr* pFribPtr = m_pPara->GetFribs();
	//XFParagraph * pXFPara = pFribPtr->GetXFPara();

	//parse fillerpage text
	if(m_pLayout->HasFillerPageText(m_pPara->GetFoundry()))
	{
		XFParagraph *pPara = new XFParagraph();
		pPara->SetStyleName(GetFillerPageStyleName());	
		m_pPara->AddXFContent(pPara);
		pFribPtr->SetXFPara(pPara);

		m_pLayout->ConvertFillerPageText(m_pPara->GetXFContainer());
	}			
	//create a new section and add it to container
	XFContentContainer* pContent = CreateXFSection();
	if(pContent)
	{
		LwpStory* pStory = static_cast<LwpStory*> ( m_pPara->GetStoryID()->obj() );
		//delete the additional blank para, 06/28/2005		
		XFParagraph* pCurrPara = pFribPtr->GetXFPara();
		if(!pCurrPara->HasContents())
		{
			XFContentContainer* pCurrContainer = m_pPara->GetXFContainer();
			if(pFrib->HasNextFrib() && (pCurrContainer->GetLastContent() == pCurrPara))
			{
				pCurrContainer->RemoveLastContent();
			}
		}		
		//end,06/28/2005
		pStory->AddXFContent( pContent );
	}
	else
	{
		LwpStory* pStory = static_cast<LwpStory*> ( m_pPara->GetStoryID()->obj() );
		pContent = pStory->GetXFContent();
	}
	if(pContent)
	{
		m_pPara->SetXFContainer( pContent );		
	}
	//out put the contents after the section frib in the same para.
	if(pFrib->HasNextFrib())
	{
		XFParagraph *pNextPara = new XFParagraph();
		pNextPara->SetStyleName(GetStyleName());		
		m_pPara->AddXFContent(pNextPara);
		pFribPtr->SetXFPara(pNextPara);
	}
	
}

/**
 * @descr:	Register filler page text style
 * 
 */
void LwpMasterPage::RegisterFillerPageStyle()
{
	LwpLayout::UseWhenType eUserType = m_pLayout->GetUseWhenType();
	if(eUserType==LwpLayout::StartOnOddPage
			||eUserType==LwpLayout::StartOnEvenPage)
	{			
		if(m_pLayout->HasFillerPageText(m_pPara->GetFoundry()))
		{
			XFParaStyle* pPagebreakStyle = new XFParaStyle;
			*pPagebreakStyle = *(m_pPara->GetXFParaStyle());
			pPagebreakStyle->SetStyleName(A2OUSTR(""));
			pPagebreakStyle->SetBreaks(enumXFBreakAftPage); 
			XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); 			
			m_FillerPageStyleName= pXFStyleManager->AddStyle(pPagebreakStyle)->GetStyleName();
		}
	}
}

/**
 * @descr:	Whether the layout is next page type
 * 
 */
sal_Bool LwpMasterPage::IsNextPageType()
{
	LwpLayout::UseWhenType eUserType = m_pLayout->GetUseWhenType();
	if(eUserType == LwpLayout::StartOnNextPage 
		|| eUserType == LwpLayout::StartOnOddPage 
		|| eUserType == LwpLayout::StartOnEvenPage )
	{
		return sal_True;
	}
	return sal_False;
}
